﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Montana.DAC;
using System.Data;
using System.Windows.Forms;

namespace Montana.Entidades
{
    public class Producto : Datos<Producto>
    {
        public string Codigo { get; set; }
        public string Descripcion { get; set; }
        public int IDFamiliaproducto { get; set; }
        public string Familiaproducto { get; set; }
        public int IDTipoproducto { get; set; }
        public string Tipoproducto { get; set; }
        public int IDUnidad { get; set; }
        public string Unidad { get; set; }
        public decimal Stock { get; set; }
        public decimal Preciooriginal { get; set; }
        public decimal Preciomanoobra { get; set; }
        public decimal Peso { get; set; }

        public string Nombredescripcion { get; set; }

        protected override string SQLBasico
        {
            get
            {
                return @"select top 400 producto.*, fp.nombre as familiaproducto, fp.id as idfamiliaproducto, 
                            tp.id as idtipoproducto, tp.nombre as tipoproducto, u.nombre as unidad,            
                            producto.nombre + ' (' + producto.descripcion + ')' as Nombredescripcion                
                            from (((producto inner join familiaproducto fp on producto.idfamiliaproducto=fp.id) 
                                    inner join tipoproducto tp on fp.idtipoproducto=tp.id)
                                    inner join unidad u on producto.idunidad=u.id)";
            }
        }

        public string StockFormato
        {
            get
            {
                if (Stock == 0)
                    return "";

                if (Stock == Math.Abs(Stock))
                    return Stock.ToString("0");

                return Stock.ToString("0.00");
            }
        }

        public string PrecioOriginalFormato
        {
            get
            {
                if (Preciooriginal == 0)
                    return "0,00";

                return Preciooriginal.ToString("0.00");
            }
        }

        public string PrecioManoObraFormato
        {
            get
            {
                if (Preciomanoobra == 0)
                    return "0,00";

                return Preciomanoobra.ToString("0.00");
            }
        }

        public void Nuevo()
        {
            try
            {
                Conectar();

                string sql = @"insert into producto (codigo, nombre, descripcion, idfamiliaproducto, 
                        idunidad, stock, preciooriginal, preciomanoobra, peso) values (@codigo, @nombre, @descripcion, 
                        @idfamiliaproducto, @idunidad, @stock, @preciooriginal, @preciomanoobra, @peso)";

                Ejecutar(sql, this);                
            }
            catch (Exception ex)
            {                
                //throw ex;
            }

            Desconectar();
        }

        public void Modificar()
        {
            Conectar();

            string sql = @"update producto set codigo=@codigo, nombre=@nombre, descripcion=@descripcion, 
                            idfamiliaproducto=@idfamiliaproducto, idunidad=@idunidad, stock=@stock, 
                            preciooriginal=@preciooriginal, preciomanoobra=@preciomanoobra, peso=@peso where id=@id";

            Ejecutar(sql, this);

            Desconectar();
        }

        public void GuardarPrecio(int idListaPrecio, string codigo, decimal precio)
        {
            DataSet ds = TraerDataSet("select id from producto where codigo=@codigo", codigo);
            int idProducto = 0;
            if (ds.Tables[0].Rows.Count == 0)
                throw new Exception("El producto no existe. Codigo:" + codigo);
            else
                idProducto = (int)ds.Tables[0].Rows[0]["id"];

            Conectar();

            string sql = @"insert into listaprecioproducto (idlistaprecio, idproducto, precio) 
                            values (" + idListaPrecio + ", " + idProducto + ", " + precio.ToString().Replace(",",".") + ")";

            Ejecutar(sql);

            Desconectar();
        }

        public bool ExisteCodigo(string codigo)
        {
            DataSet ds = TraerDataSet("select id from producto where codigo=@codigo", codigo);

            if (ds.Tables[0].Rows.Count == 0)
                return false;
            else
                return true;
        }

        public List<Producto> BuscarPorNombreDescripcion(string nombreDescripcion)
        {
            return TraerObjetos(SQLBasico + " where producto.nombre like '%" + nombreDescripcion +
                    "%' or producto.descripcion like '%" + nombreDescripcion + "%'");
        }

        public DataSet BuscarDataSetPorNombreDescripcion(string nombreDescripcion)
        {
            return TraerDataSet(SQLBasico + " where producto.nombre like '%" + nombreDescripcion +
                    "%' or producto.descripcion like '%" + nombreDescripcion + "%'");
        }

        public List<Producto> BuscarPorCodigo(string codigo)
        {
            return TraerObjetos(SQLBasico + " where producto.codigo='" + codigo + "'");
        }

        public void ActualizarPrecioOriginal(string codigo, decimal precioManoObra)
        {
            string sql = @"update producto set preciooriginal=" + precioManoObra.ToString().Replace(",",".") + " where codigo='" + codigo + "'";

            Ejecutar(sql);
        }

        public void ActualizarPrecioManoObra(string codigo, decimal precio)
        {
            string sql = @"update producto set preciomanoobra=" + precio.ToString().Replace(",", ".") + " where codigo='" + codigo + "'";

            Ejecutar(sql);
        }

        public void ActualizarListaPrecio(string codigo, int idListaPrecio)
        {
            string sql = "select id from producto where codigo=@codigo";

            object idProducto = TraerValor(sql, codigo);

            if (idProducto == null)
            {
                MessageBox.Show("Ingresar el producto: " + codigo, "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            sql = "insert into listaprecioproducto (idlistaprecio, idproducto) values (@idlistaprecio, @idproducto)";

            Ejecutar(sql, idListaPrecio, idProducto);
        }

        public void CargarComboConDescripcion(ComboBox combo, DataSet ds)
        {
            CargarCombo(combo, ds, "NombreDescripcion", true);
        }
    }
}
